/**
 * 
 */
package cn.com.easy.permission.dao;

import javax.persistence.QueryHint;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.jpa.repository.QueryHints;

import cn.com.easy.permission.model.RoleModel;
import cn.com.easy.permission.model.UserModel;
import cn.com.easy.permission.model.UserRolesMappingModel;

/**
 * 用户--角色 映射表
 * 
 * @author nibili 2015年9月16日下午6:33:07
 * 
 */
public interface UserRolesMappingDao extends JpaRepository<UserRolesMappingModel, Long>, JpaSpecificationExecutor<UserRolesMappingModel> {

	/**
	 * 按角色id查找用户
	 * 
	 * @param roleId
	 * @return
	 * @author nibili 2015年12月10日
	 */
	@Query("select u from UserModel u where u.id in (select mapping.userId from UserRolesMappingModel mapping where mapping.roleId = ?1)")
	@QueryHints({@QueryHint(name = "org.hibernate.cacheable", value ="true") })
	public Page<UserModel> findUserModelByRoleId(Long roleId, Pageable pageable);

	/**
	 * 按角色id以及用户名
	 * 
	 * @param roleId
	 * @param pageable
	 * @return
	 * @author nibili 2015年12月23日
	 */
	@Query("select u from UserModel u where (u.loginname like %?2% or u.realname like %?2%) and u.id in (select mapping.userId from UserRolesMappingModel mapping where mapping.roleId = ?1)")
	public Page<UserModel> findUserModelByRoleIdAndNameLike(Long roleId, String name,Pageable pageable);

	/**
	 * 按角色id和用户id查找对应关系
	 * 
	 * @param roleId
	 * @param userId
	 * @return
	 * @author nibili 2015年12月11日
	 */
	 @QueryHints({@QueryHint(name = "org.hibernate.cacheable", value ="true") })
	public UserRolesMappingModel findByRoleIdAndUserId(Long roleId, Long userId);

	/**
	 * 按角色id删除mapping
	 * 
	 * @param roleId
	 * @return
	 * @author nibili 2015年12月11日
	 */
	@Modifying
	public Integer deleteByRoleId(Long roleId);

	/**
	 * 按角色id与成员id删除记录
	 * 
	 * @param roleId
	 * @param userId
	 * @return
	 * @author nibili 2015年12月11日
	 */
	@Modifying
	public Integer deleteByRoleIdAndUserId(Long roleId, Long userId);

	/**
	 * 按用户id查找其角色
	 * 
	 * @param userId
	 * @return
	 * @auth nibili 2015年12月12日 下午2:41:07
	 */
	@Query("select r from RoleModel r where r.id in (select ur.roleId  from UserRolesMappingModel ur where ur.userId=?1)")
	public Page<RoleModel> findRolesByUserId(Long userId, Pageable pageable);
}
